package com.zp.self.module.level_4_算法练习.算法.双指针.快慢指针;

import com.zp.self.module.level_4_算法练习.数据结构.链表.ListNode;

/**
 * @author By ZengPeng
 */
public class 力扣_876_链表的中间结点 {
    //测试
    public static void main(String[] args) {

        System.out.println(new 力扣_876_链表的中间结点().middleNode(ListNode.getNode()));
    }

    /**
    题目：给定一个头结点为 head 的非空单链表，返回链表的中间结点。
          如果有两个中间结点，则返回第二个中间结点。

     示例 1：
     输入：[1,2,3,4,5]
     输出：此列表中的结点 3 (序列化形式：[3,4,5])
     返回的结点值为 3 。 (测评系统对该结点序列化表述是 [3,4,5])。
     注意，我们返回了一个 ListNode 类型的对象 ans，这样：
     ans.val = 3, ans.next.val = 4, ans.next.next.val = 5, 以及 ans.next.next.next = NULL.

     示例 2：
     输入：[1,2,3,4,5,6]
     输出：此列表中的结点 4 (序列化形式：[4,5,6])
     由于该列表有两个中间结点，值分别为 3 和 4，我们返回第二个结点。

    分析：【P ♥】
       1.遍历两遍：第一次记录数量，第二次找到要返回的点
       2.快慢指针：高手当然要一次遍历通过啦 -- 执行用时：0 ms, 在所有 Java 提交中击败了100.00%的用户

    边界值 & 注意点：
       1.
     **/
    public ListNode middleNode(ListNode head) {
        ListNode quick=head.next,slow=head;
        while (quick!=null){
            quick=quick.next;
            if(quick==null)return slow.next;
            quick =quick.next;
            slow=slow.next;
        }
        return slow;
    }
}
